package main.java.string;
/* 字符串重用演示 */
public class StringDemo {
    public static void main(String[] args) {
        //创建对象
        String s1 = "123abc";
        //重用s1对象(重用常量池中"123abc"对象)
        String s2 = "123abc";
        System.out.println("s1:" + s1);
        System.out.println("s2:" + s2);
        //输出判断s1==s2是否成立，结果为true/false
        System.out.println(s1==s2);//true
        //创建对象
        String s3 = "123abc";
        System.out.println("s3:" + s3);
        //输出判断s1==s3是否成立，结果为true/false
        System.out.println(s1==s3);//true

        //new一定创建新对象
        String s4 = new String("123abc");
        System.out.println("s4:" + s4);
        //输出判断s1==s4是否成立，结果为true/false
        System.out.println(s1==s4);//false  因为是new出来的对象，跟上面的不是同一个对象


        /*
            触发编译器的预计算特性:编译器编译代码时如果在编译期间可以确定一个计算表达式的结果时就会进行计算，并将结果
            替换这个表达式，例如下面的代码:String s5 ="123"+"abc";
            会被编译器改为:String s5 ="123abc";//class文件中的样子，因此s5会重用对象
         */

        //创建对象
        String s5 = "abc"+"123";
        //输出对象的值
        System.out.println("s5:" + s5);
        //输出判断s1==s5是否成立，结果为true/false
        System.out.println(s1 == s5);//true

        String s = "123" ;
        String s6 = s + "abc";//这里不会触发编译器的预计算特性
        System.out.println("s6:" + s6);
        System.out.println(s1 == s6);//false，没有重用常量池对象

        //修改内容就会创建新对象
        s1 = s1+1;
        //修改内容就会创建新对象，会改变值，s1输出新对象的值+1
        System.out.println(s1);
        //输出s2的值
        System.out.println(s2);
        //判断s1和s2是否指向同一个对象，结果为false
        //因为s1修改了内容，创建了新的对象
        System.out.println(s1 == s2);
    }
}
